package com.huazi.ucenter.controller;

import com.google.gson.Gson;
import com.huazi.commonutils.JwtUtils;
import com.huazi.servicebase.exceptionhandler.MyException;
import com.huazi.ucenter.entity.Member;
import com.huazi.ucenter.service.MemberService;
import com.huazi.ucenter.utils.HttpClientUtils;
import com.huazi.ucenter.utils.UcenterPropertiesUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;



import java.io.UnsupportedEncodingException;

import java.net.URLEncoder;
import java.util.HashMap;

/**
 * @author shkstart
 * @create 2021-03-28 21:12
 */
@Controller//请求的是地址，所以需要改成Controller
@CrossOrigin
@RequestMapping("/api/ucenter/wx")
public class WeiXinController {
    @Autowired
    RedisTemplate<String,Object> redisTemplate;
    @Autowired
    MemberService memberService;
    //登录成功后的重定向,获取扫描人的信息，添加数据
    @GetMapping("/callback")
    public String callback( String code, String state){
        //1.获取code值，临时票据，类似验证码
        //2拿着code请求微信固定的地址，得到两个值 accsess_token 和 openid
        //请求固定地址
        String baseAccessTokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token"+
                "?appid=%s"+
                "&secret=%s"+"&code=%s"+
                "&grant_type=authorization_code";
        //拼接三个参数 id 密钥 和 code 值
        String accessTokenUrl = String.format(baseAccessTokenUrl,
                UcenterPropertiesUtils.APP_ID,
                UcenterPropertiesUtils.APPSECRET,
                code);
        //请求这个拼接好的地址，得到返回扫码人物信息
        //使用http的工具类获取数据
        try {
            //获取工具类的返回值
            String accessTokenInfo = HttpClientUtils.get(accessTokenUrl);

            //测试输出扫码后得到的数据
            System.out.println(accessTokenInfo);
            //返回的是一个字符串，需要转换成json
            Gson gson= new Gson();
            HashMap accessMap = gson.fromJson(accessTokenInfo, HashMap.class);
            //获取需要的token和id
            String access_token = (String) accessMap.get("access_token");
            String openid = (String) accessMap.get("openid");
            //把得到的信息存入数据库中
            //先判断openid这个唯一标识是否存在信息

            Member member = memberService.getOpenIdMember(openid);
            System.out.println("member--"+member);
            if(member==null){
                //拿着得到access_token 和 openid ，再去请求微信提供固定的地址，获取到扫码人的信息
                //访问微信的资源服务器（固定地址），获取用户信息
                String baseUserInfoUrl = "https://api.weixin.qq.com/sns/userinfo" +
                        "?access_token=%s" +
                        "&openid=%s";
                //传入access_token和openid获取信息
                String userInfoUrl = String.format(baseUserInfoUrl, access_token, openid);
                //获取到的数据也是一个字符串
                String userInfo = HttpClientUtils.get(userInfoUrl);
                System.out.println(userInfo);
                //转换成json格式
                HashMap userInfoMap = gson.fromJson(userInfo, HashMap.class);
                //获取昵称和头像地址
                String nickname = (String) userInfoMap.get("nickname");
                String headImgUrl= (String) userInfoMap.get("headimgurl");
                member=new Member();//添加数据信息
                member.setIsDisabled(false)
                        .setNickname(nickname)
                        .setOpenid(openid)
                .setAvatar(headImgUrl);
                memberService.save(member);
            }else{//不等于空时判断用户是否可用
                if (member.getIsDisabled()) throw new MyException("对不起，您的用户已禁用！");
            }
            //使用jiwt根据member对象生成token字符串
            String jwtToken = JwtUtils.getJwtToken(member.getId(),member.getNickname());
            System.out.println("jwt--"+jwtToken);
            //最后:返回首页面，通过路径传递token字符串
            //一切准备好就返回首页
            return "redirect:"+"http://huazaizai.vipgz1.idcfengye.com/?token="+jwtToken;
        } catch (Exception e) {
            throw  new MyException("登录失败！");
        }

    }
    //生成微信扫描二维码
    @GetMapping("/login")
    public String getWxCode(){
        //请求微信地址
        String baseUrl="https://open.weixin.qq.com/connect/qrconnect" +
                "?appid=%s"+
                "&response_type=code" +
                "&redirect_uri=%s"+
                "&scope=snsapi_login"+
                "&state=%s"+
                "#wechat_redirect";

        //格式路径编码
        String redirect_url=UcenterPropertiesUtils.REDIRECT_URL;
        try {
            redirect_url=URLEncoder.encode(redirect_url,"utf-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        //使用格式化提高效率，减少开销
        String url = String.format(baseUrl, UcenterPropertiesUtils.APP_ID, redirect_url, "atguigu");
        return "redirect:"+url;
    }
}
